Dynamicke pole se vzdalenym pristupem
Otázka od: David Kraina
18. 9. 2004 20:25
Dobry den,
marne uz vice jak pul dne bojuju s pointery a tak se pokusim obratit pro
pomoc mezi (mozna) odborniky :
Mam dve procedury :
Procedure A;
Var PA : Array of Char;
X : Pointer;
Begin
B(X);
SetLength(X, ?);
CopyMemory(PA, X, ...
FreeMem(X);
End;
Procedure B(out Buffer : Ponter);
Begin
GetMem(Buffer, ?);
CopyMemory(Buffer ...
...a vrati velikost, se kterou pak pracuju...
End;
Jestli jste nekdo pochopili umysl, potrebuji, aby procedura B realokovala
predany buffer, a nahazela tam co potrebuje.
Zkousel jsem uz vsechno mozne, ale zvdy to konci "Invalid pointer operation"
ci RE 216 - "Access volation".
Nekdy to zase funguje, ale uz nelze s bufferem, ktery preda B nijak
manipulovat (2. instance)
Taky nechapu, pro GetMem nealokuje to, co po nem chcu, ale mnohem vice, coz
je problem a musim pole zkracovat - problem vyse.
Ideal proste je, ze funkci B predam PA a o nic vic se nestarat.
Asi to zni dosti zoufale, ale uz toho mam fakt plne vsechno, a tak diky za
kazdou radu.
S pozdravem
David Kraina, DKx
---------------------------
Vedouci vyvojarskeho tymu MX-3, programator
http://DKx.MX-3.cz
http://www.MX-3.cz
Odpovedá: tondrej@t-online.de
18. 9. 2004 20:40
> Jestli jste nekdo pochopili umysl,
Sorry, nepochopil som.
> potrebuji, aby procedura B realokovala
> predany buffer, a nahazela tam co potrebuje.
Kedze ten parameter je deklarovany ako out, prva vec, co ta procedura
urobi, je nastavi ho na nil. Okrem toho, v tele pouzivas GetMem, takze
nechapem, co hovoris o realokacii.
Procedura A zase obsahuje pseudokod, ktory uz vobec nechapem a myslim,
ze SetLength s parametrom typu Pointer sa ani neskompiluje.
> Asi to zni dosti zoufale, ale uz toho mam fakt plne vsechno, a tak diky za
> kazdou radu.
Skus inymi slovami a podrobnejsie popisat, co sa snazis dosiahnut a aky
je s tym problem.
HTH
TOndrej
Odpovedá: Slavomir Skopalik
18. 9. 2004 20:55
> Dobry den,
> marne uz vice jak pul dne bojuju s pointery a tak se pokusim
> obratit pro pomoc mezi (mozna) odborniky :
>
> Mam dve procedury :
>
> Procedure A;
> Var PA : Array of Char;
> X : Pointer;
> Begin
> B(X);
> SetLength(X, ?);
> CopyMemory(PA, X, ...
> FreeMem(X);
> End;
>
> Procedure B(out Buffer : Ponter);
> Begin
> GetMem(Buffer, ?);
> CopyMemory(Buffer ...
> ...a vrati velikost, se kterou pak pracuju...
> End;
>
Tedy, vubec jsem nepochopil smysl tveho snazeni.
Zkus popsat o co ti jde, na mne to pusobi, jako ze chces prihodit neco
malo na zacatek (nebo konec ?)
buffru. Uz vubec nechapu vyznam PA (deklarujes dynamicke pole), proc ?
Podle men tohle nejde ani prelozit (nezkosel jsem).
Slavek
Odpovedá: Vlastimil Burian
18. 9. 2004 21:37
Mel bys byt trochu konkretnejsi ! Z toho cos napsal moc nepoznam(e) jake mas
presne umysly. Nevim jestli sem ten umysl pochopil ale mrkni na tohle:
-----------------------
mas tlacitko, po kliknuti si alokujeme nakou pamet pro BufX jako zdrojovy
buffer pro pozdejsi kopirovani, dame si do nej neco abychom pak mohli
vyzkouset jestli to funguje ...
-----------------------
const
SIZEofBUFFER = 200;
var
BufX : Pointer;
procedure B(out Buffer: Pointer);
begin
GetMem(Buffer, SIZEofBUFFER);
CopyMemory(Buffer, BufX, SizeOf(BufX));
end;
procedure A;
var PA : Array of Char;
X : Pointer;
begin
B(X);
// velikost dynam. pole zalezi na tom co tam davas ... v tomhle pripade to
bude stacit
SetLength(PA, SIZEofBUFFER);
CopyMemory(PA, X, Length(PA));
FreeMem(X);
showmessage(PA[0]); // test
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
GetMem(BufX, SIZEofBUFFER);
Char(BufX^) := 'X';
try
A;
finally
FreeMem(BufX);
end;
end;
Dobry den,
marne uz vice jak pul dne bojuju s pointery a tak se pokusim obratit pro
pomoc mezi (mozna) odborniky :
Mam dve procedury :
Procedure A;
Var PA : Array of Char;
X : Pointer;
Begin
B(X);
SetLength(X, ?);
CopyMemory(PA, X, ...
FreeMem(X);
End;
Procedure B(out Buffer : Ponter);
Begin
GetMem(Buffer, ?);
CopyMemory(Buffer ...
...a vrati velikost, se kterou pak pracuju...
End;
Jestli jste nekdo pochopili umysl, potrebuji, aby procedura B realokovala
predany buffer, a nahazela tam co potrebuje.
Zkousel jsem uz vsechno mozne, ale zvdy to konci "Invalid pointer operation"
ci RE 216 - "Access volation".
Nekdy to zase funguje, ale uz nelze s bufferem, ktery preda B nijak
manipulovat (2. instance)
Taky nechapu, pro GetMem nealokuje to, co po nem chcu, ale mnohem vice, coz
je problem a musim pole zkracovat - problem vyse.
Ideal proste je, ze funkci B predam PA a o nic vic se nestarat.
Asi to zni dosti zoufale, ale uz toho mam fakt plne vsechno, a tak diky za
kazdou radu.
S pozdravem
David Kraina, DKx
---------------------------
Vedouci vyvojarskeho tymu MX-3, programator
http://DKx.MX-3.cz
http://www.MX-3.cz